package org.example.MVC;

import org.example.Spring.Bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller    //该注解可以将普通的类声明成Spring MAC的处理器类，但是只使用@Controller注解的话，Spring MAC框架并不能确定当前Web请求由哪个Handler(处理器)进行处理。
@RequestMapping("/springMVC")    //注解到类上，其value属性值作为请求URL的第一级访问目录
//设置当前类为处理类
public class FirstController {
    //设定当前方法的访问映射地址。访问该方法时需要通过’test‘路径访问
    //@RequestMapping("/test")
    @RequestMapping(value = {"/test","/test1"})    //用不同的路径访问相同的方法（可通过"/test"访问该方法，也可以通过"/test1"访问该方法）
    //设置当前方法返回类型为String，用于指定请求完成后跳转的页面
    public String sayHello(){
        System.out.println("访问到FirstController！");
        //指定具体跳转页面
        return "success";
    }

    //method属性表请求方式
    //浏览器为get请求，如果method值为RequestMethod.GET，可省略
    //如果value属性值相同，则会执行最后一个
    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public String sayHello2(){
        System.out.println("！！！！");
        //指定具体跳转页面
        return "success2";
    }

    //method属性值为多个，表可通过多种请求方式。  以下可通过get和post请求方式
    @RequestMapping(value = "/test3",method = {RequestMethod.GET,RequestMethod.POST})
    public String sayHello3(){
        System.out.println("访问到FirstController！");
        //指定具体跳转页面
        return "success2";
    }

    //params属性用于指定客户端请求中参数的值必须包含哪些参数的值时，才可以通过其标注的方法处理。可以将请求映射的定位范围缩小
    @RequestMapping(value = "/test4",params = "id=1")    //当客户端进行请求时，如果请求参数的值等于params属性的值，则可正常执行所映射到方法，否则映射到的方法不执行
    public String sayHello4(String id){
        System.out.println("id = "+id);
        //指定具体跳转页面
        return "success2";
    }

    @PostMapping(value = "/test5")        //匹配post请求方式（只可用post请求方式才可映射到该方法）
    public String sayHello5(){
        System.out.println("post请求方式!");
        //指定具体跳转页面
        return "success2";
    }

    //简单数据类型绑定
    @RequestMapping("/test6")
    public String sayHello6(String name){   //用于接收客户端请求中的参数（和方法的形参名称一致，才可赋值到）
        System.out.println("name = "+name);
        //指定具体跳转页面
        return "success2";
    }

    //spring MVC提供了@RequestParam注解来定义参数的别名
    //value:指参数的名称   required:用于指定参数是否必须，默认是true，表示请求中一定要有相对应的参数（请求参数和方法的形参）
    //defaultValue:形参的默认值，表示如果请求中没有同名参数时，形参的值则为defaultValue属性的值
    @RequestMapping("/test7")
    public void sayHello7(@RequestParam(value = "name",
            required = false,defaultValue = "itheima") String username){
        System.out.println("username = "+username);
    }

    //@PathVariable注解可以将URL中占位符参数绑定到处理器的形参中
    @RequestMapping("/test8/{name}")
    public void sayHello8(@PathVariable(value = "name") String username){
        System.out.println("username = "+username);
    }

    //接收表单用户的信息
    @RequestMapping("/testUser")
    public String sayHello9(){
        return "register";         //需要该方法跳转到表单页面
    }
    @RequestMapping("/registerUser")
    public String sayHello9(User user){
        System.out.println("name = "+user.getName()+"\npassword = "+user.getPassword());
        return "success";
    }

    //接收商品选购信息
    @RequestMapping("/testProduct")
    public String sayHello10(){
        return "products";         //需要该方法跳转到表单页面
    }
    @RequestMapping("/registerProduct")     //默认是get请求方式
    /*数组绑定
    public void sayHello10(String[] proIds){       //方法的形参必须对应请求参数的名称
        for (String proId:proIds) {
            System.out.println("获取到了Id为"+proId+"的商品");
        }
    }
    */
    //集合绑定         处理器的形参名称需要使用@RequestParam注解标注
    public void sayHello10(@RequestParam("proIds") List<String> proIds){
        for(String proId:proIds){
            System.out.println("获取到了Id为"+proId+"的商品");
        }
    }

    //JSON数据绑定
    //获取单个商品信息
    @RequestMapping("/getProduct")
    public void getProduct(@RequestBody Product product){
        String proId = product.getProId();
        String proName = product.getProName();
        System.out.println("获取到了id为"+proId+",名称为"+proName+"的商品");
    }
    //获取多个商品信息
    @RequestMapping("/getProductList")
    public void getProductList(@RequestBody List<Product> products){
        for(Product product:products) {
            String proId = product.getProId();
            String proName = product.getProName();
            System.out.println("获取到了id为" + proId + ",名称为" + proName + "的商品");
        }
    }
}
